package test;

public class TrainTicketSeller {
  private int tickets = 100; // 初始有 100 张票

  public void sellTicket() {
    // 当票数大于 0 时，才能售出票
    while (tickets > 0) {
      synchronized (this) {
        if (tickets > 0) {
          System.out.println("售出第 " + tickets + " 张票");
          tickets--;
        } else {
          System.out.println("票已售完");
        }

        // 通知其他线程可以存入票了
        notify();
      }

      try {
        // 让当前线程休眠一段时间，模拟售票过程
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  public void saveTicket() {
    // 当票数小于 100 时，才能存入票
    while (tickets < 100) {
      synchronized (this) {
        if (tickets < 100) {
          System.out.println("存入第 " + (tickets + 1) + " 张票");
          tickets++;
        } else {
          System.out.println("票已满");
        }

        // 通知其他线程可以售出票了
        notify();
      }

      try {
        // 让当前线程休眠一段时间，模拟存入票的过程
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }

  public static void main(String[] args) {
    TrainTicketSeller seller = new TrainTicketSeller();

    // 创建并启动售票线程
    new Thread(() -> seller.sellTicket()).start();

    // 创建并启动存票线程
    new Thread(() -> seller.saveTicket()).start();
  }
}
